using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class CashFactory 
{
    // 简单工厂的使用

    public static CashSuper CreateCashAccept(AcceptType type)
    {
        CashSuper cs = null;
        switch (type)
        {
            case AcceptType.Norma:
                cs = new CashNormal();
                break;
            case AcceptType.Rebate:
                cs = new CashRebate(0.8f);
                break;
            case AcceptType.Return:
                cs = new CashReturn(300,100);
                break;
        }
        return cs;
    }
}


public class CashContext
{
    // 策略与简单工厂结合 
    // 所谓的策略模式，实现看起来和简单工厂没什么大的区别。
    // 所谓用来封装算法，其实本质还是 根据类型，实例化不同的对象，这些对象有统一的接口定义和调用
    // 要说不一样，案例里将静态的工厂函数写在了一个类里，多了个中间类取值。好处是不用在外面另外 new 一个类做中间取值的样子。
    // 看概念容易让人迷惑，就当成简单工厂类似。在实际操作中再逐渐细分。

    private CashSuper cs = null;

    public CashContext(AcceptType type)
    {
        switch (type)
        {
            case AcceptType.Norma:
                cs = new CashNormal();
                break;
            case AcceptType.Rebate:
                cs = new CashRebate(0.8f);
                break;
            case AcceptType.Return:
                cs = new CashReturn(300, 100);
                break;
        }
    }

    public float GetResult(float money)
    {
        return  cs.AcceptCash(money);
    }
}



/// <summary>
/// 收费类型
/// </summary>
public enum AcceptType
{
    /// <summary>
    /// 正常收费
    /// </summary>
    Norma = 0,
    /// <summary>
    /// 打折收费
    /// </summary>
    Rebate = 1,
    /// <summary>
    /// 返利(满减)
    /// </summary>
    Return = 2,
}
